home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / sound / mtlabsnd.zip / ST.H < prev    next >
C/C++ Source or Header  |  1993-04-26  |  6KB  |  193 lines

  1. /*
  2.  * July 5, 1991
  3.  * Copyright 1991 Lance Norskog And Sundry Contributors
  4.  * This source code is freely redistributable and may be used for
  5.  * any purpose.  This copyright notice must be maintained. 
  6.  * Lance Norskog And Sundry Contributors are not responsible for 
  7.  * the consequences of using this software.
  8.  */
  9.  
  10. /*
  11.  * Sound Tools sources header file.
  12.  */
  13.  
  14. #include <stdio.h>
  15.  
  16. /*
  17.  * Handler structure for each format.
  18.  */
  19.  
  20. typedef struct format {
  21.     char    **names;    /* file type names */
  22.     int    (*startread)();            
  23.     int    (*read)();            
  24.     int    (*stopread)();        
  25.     int    (*startwrite)();            
  26.     int    (*write)();
  27.     int    (*stopwrite)();        
  28. } format_t;
  29.  
  30. extern format_t formats[];
  31.  
  32. /* Signal parameters */
  33.  
  34. struct  signalinfo {
  35.     long    rate;            /* sampling rate */
  36.     int    size;            /* word length of data */
  37.     int    style;            /* format of sample numbers */
  38.     int    channels;        /* number of sound channels */
  39. };
  40.  
  41. /* Pipe parameters */
  42.  
  43. struct    pipeinfo {
  44.     FILE    *pout;            /* Output file */
  45.     FILE    *pin;            /* Input file */
  46. };
  47.  
  48. /*
  49.  *  Format information for input and output files.
  50.  */
  51.  
  52. #define    PRIVSIZE    50
  53.  
  54. struct soundstream {
  55.     struct    signalinfo info;    /* signal specifications */
  56.     char    swap;            /* do byte- or word-swap */
  57.     char    seekable;        /* can seek on this file */
  58.     char    *filename;        /* file name */
  59.     char    *filetype;        /* type of file */
  60.     FILE    *fp;            /* File stream pointer */
  61.     format_t *h;            /* format struct for this file */
  62.     char    priv[PRIVSIZE];        /* format's private data area */
  63. };
  64.  
  65. extern struct soundstream informat, outformat;
  66. typedef struct soundstream *ft_t;
  67.  
  68. /* Size field */
  69. #define    BYTE    1
  70. #define    WORD    2
  71. #define    LONG    4
  72. #define    FLOAT    5
  73. #define DOUBLE    6
  74. #define IEEE    7        /* IEEE 80-bit floats.  Is it necessary? */
  75. #define DBLBYT  8               /* Byte data stored as a double (matlab) */
  76. #define DBLWRD  9               /* Word data stored as a double (matlab) */
  77.  
  78. /* Style field */
  79. #define UNSIGNED    1    /* unsigned linear: Sound Blaster */
  80. #define SIGN2        2    /* signed linear 2's comp: Mac */
  81. #define    ULAW        3    /* U-law signed logs: US telephony, SPARC */
  82. #define ALAW        4    /* A-law signed logs: non-US telephony */
  83.  
  84. extern char *sizes[], *styles[];
  85.  
  86. /*
  87.  * Handler structure for each effect.
  88.  */
  89.  
  90. typedef struct {
  91.     char    *name;            /* effect name */
  92.     int    flags;            /* this and that */
  93.     int    (*getopts)();        /* process arguments */
  94.     int    (*start)();        /* start off effect */
  95.     int    (*flow)();        /* do a buffer */
  96.     int    (*drain)();        /* drain out at end */
  97.     int    (*stop)();        /* finish up effect */
  98. } effect_t;
  99.  
  100. extern effect_t effects[];
  101.  
  102. #define    EFF_CHAN    1        /* Effect can mix channels up/down */
  103. #define EFF_RATE    2        /* Effect can alter data rate */
  104. #define EFF_MCHAN    4        /* Effect can handle multi-channel */
  105.  
  106. struct effect {
  107.     char        *name;        /* effect name */
  108.     struct signalinfo ininfo;    /* input signal specifications */
  109.     struct signalinfo outinfo;    /* output signal specifications */
  110.     effect_t     *h;        /* effects driver */
  111.     char        priv[PRIVSIZE];    /* private area for effect */
  112. };
  113.  
  114. typedef struct effect *eff_t;
  115.  
  116. #ifdef    __STDC__
  117. #define    P1(x) x
  118. #define    P2(x,y) x, y
  119. #define    P3(x,y,z) x, y, z
  120. #define    P4(x,y,z,w) x, y, z, w
  121. #else
  122. #define P1(x)
  123. #define P2(x,y)
  124. #define P3(x,y,z)
  125. #define P4(x,y,z,w)
  126. #endif
  127.  
  128. /* Utilities to read and write shorts and longs little-endian and big-endian */
  129. unsigned short rlshort(P1(ft_t ft));            /* short little-end */
  130. unsigned short rbshort(P1(ft_t ft));            /* short big-end    */
  131. unsigned short wlshort(P2(ft_t ft, unsigned int us));    /* short little-end */
  132. unsigned short wbshort(P2(ft_t ft, unsigned int us));    /* short big-end    */
  133. unsigned long  rllong(P1(ft_t ft));            /* long little-end  */
  134. unsigned long  rblong(P1(ft_t ft));            /* long big-end     */
  135. unsigned long  wllong(P2(ft_t ft, unsigned long ul));    /* long little-end  */
  136. unsigned long  wblong(P2(ft_t ft, unsigned long ul));    /* long big-end     */
  137. /* Read and write words and longs in "machine format".  Swap if indicated.  */
  138. unsigned short rshort(P1(ft_t ft));            
  139. unsigned short wshort(P2(ft_t ft, unsigned int us));
  140. unsigned long  rlong(P1(ft_t ft));        
  141. unsigned long  wlong(P2(ft_t ft, unsigned long ul));
  142. double rdouble(P1(ft_t ft));
  143. double rdouble(P2(ft_t ft, double d));
  144.  
  145. long dbl_to_ub(P1(double d));
  146. long dbl_to_sb(P1(double d));
  147. long dbl_to_us(P1(double d));
  148. long dbl_to_ss(P1(double d));
  149.  
  150. double ub_to_dbl(P1(unsigned long ub));
  151. double sb_to_dbl(P1(unsigned long sb));
  152. double us_to_dbl(P1(unsigned long us));
  153. double ss_to_dbl(P1(unsigned long ss));
  154.  
  155. /* Utilities to byte-swap values */
  156. unsigned short swapw(P1(unsigned int us));        /* Swap short */
  157. unsigned long  swapl(P1(unsigned long ul));        /* Swap long */
  158.  
  159. #ifdef    SYSV
  160. #define    bcopy(from, to, len)    memcpy(to, from, len)
  161. #define    index        strchr
  162. #define    rindex        strrchr
  163. #endif
  164.  
  165. typedef    unsigned int u_i;
  166. typedef    unsigned long u_l;
  167. typedef    unsigned short u_s;
  168.  
  169. #define    MAXRATE    50*1024            /* maximum sample rate */
  170.  
  171. #ifdef    unix
  172. /* Some wacky processors don't have arithmetic down shift, so do divs */
  173. #define LEFT(datum, bits)    (datum << bits)
  174. /* Most compilers will turn this into a shift if they can, don't worry */
  175. #define RIGHT(datum, bits)    (datum / (1L << bits))
  176. #else
  177. /* x86 & 68k PC's have arith shift ops and dumb compilers */
  178. #define LEFT(datum, bits)    (datum << bits)
  179. #define RIGHT(datum, bits)    (datum >> bits)
  180. #endif
  181.  
  182. #ifndef    M_PI
  183. #define M_PI    3.14159265358979323846
  184. #endif
  185.  
  186. #ifdef    unix
  187. #define READBINARY    "r"
  188. #define WRITEBINARY    "w"
  189. #else
  190. #define READBINARY    "rb"
  191. #define WRITEBINARY    "wb"
  192. #endif
  193.